package com.seek.core;

import java.io.Serializable;
import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;

public interface BaseReadDao<T extends Serializable> {

	/**
	 * 根据ID得到某个实体
	 */
	public T get(Serializable id);

	/**
	 * 根据ID得到某个实体
	 */
	public T load(Serializable id, boolean lock);

	/**
	 * 根据ID得到某个实体
	 */
	public T load(Serializable id);

	/**
	 * 返回某种实体的集合
	 */
	public List<T> findAll();

	/**
	 * 根据某个某个属性值的到实体List
	 */
	public List<T> findByProperty(String property, Object value);

	/**
	 * 根据某个某个属性值的到某个实体
	 */
	public T findUniqueByProperty(String property, Object value);
	
	/**
	 * 根据hql语句得到某个实体
	 */
	public T findUniqueByHql(String hql,Object...values);

	/**
	 * 根据某个某个属性值得到相应实体个数
	 */
	public int countByProperty(String property, Object value);

	public void refresh(T entity);

	public Class<T> getPersistentClass();
	
	/**
	 * 按HQL查询对象列表.
	 * 
	 * @param hql
	 *            hql语句
	 * @param values
	 *            数量可变的参数
	 */
	public List<T> findByHql(String hql, Object... values);
	
	/**
	 * 根据sql语句查询集合
	 */
	public List<T> findBySql(String sql, Object... values);
	
	/**
	 * 根据查询函数与参数列表创建Query对象,后续可进行更多处理,辅助函数.
	 */
	public Query createQuery(String queryString, Object... values);
	
	/**
	 * 使用 hql 语句进行操作
	 * 
	 * @param hql
	 *            HSQL 查询语句（使用回调函数访问外部变量，必须是final的）
	 * @param offset
	 *            开始取数据的下标
	 * @param length
	 *            读取数据记录数
	 * @return List 结果集
	 */
	public List<T> getListForPage(final String hql, final int offset, final int length);
	
	/**
	 * 
	 * getAllRowCount:查询所有记录数
	 * 
	 * @param hql hql语句
	 * @return int 返回总记录数
	 * 
	 * 
	 */
	public int getAllRowCount(String hql);
	
	/**
	 * 使用 hql 语句进行操作
	 * 
	 * @param hql
	 *            HSQL 查询语句
	 * @param offset
	 *            开始取数据的下标
	 * @param length
	 *            读取数据记录数
	 @param values
	 *            数量可变的参数
	 * @return List 结果集
	 */
	public List<T> findByHql(String hql,int offset,int length, Object... values);
	
	
	/**
	 * 
	 * getAllRowCount:查询所有记录数
	 * 
	 * @param hql hql语句
	 * @param values
	 *            数量可变的参数
	 * @return int 返回总记录数
	 * 
	 * 
	 */
	public int getAllRowCount(String hql,Object...values);
	
	/**
	 * 根据Class、ID得到某个实体
	 */
	public T get(Class<Object> c, Serializable id);
	
	/**
	 * 使用 sql 语句进行操作
	 * 
	 * @param sql
	 *            SQL 查询语句（使用回调函数访问外部变量，必须是final的）
	 * @param offset
	 *            开始取数据的下标
	 * @param length
	 *            读取数据记录数
	 * @return List 结果集
	 */
	@SuppressWarnings("rawtypes")
	public List<T> getListForPageBySql(final String sql, final int offset,
			final int length,Class c);
	
	/**
	 * 
	 * getAllRowCountBySql:查询所有记录数
	 * 
	 * @param sql sql语句
	 * @return int 返回总记录数
	 * 
	 * 
	 */
	public int getAllRowCountBySql(String sql );
	
	public Session getSession();
	/**
	 * 分页查询，返回List<Map<String,String>>
	 */
	public List getListMapForPageBySql(final String sql, final int offset,
			final int length);
	

	public List findBySql(String sql);
	
	public void executeUpdateSql(String sql,Object... values) throws Exception;
	
	public int executeUpdateSqlWithRetun(String sql, Object... values) throws Exception;
	
	public List findMapBySql(String sql, Object... values);
	
	public Object findUniqueMapBySql(String sql,Object... values);
	
}
